import os
from typing import Any
import requests
import pandas as pd
  
class NeuroConsolidator(object):
    """Класс для укрупнения через нейоросеть
    """
    version = "1.0"
    def __init__(self,api_url:str):
        """Конструктор класса

        Args:
            api_url (str): API Url
        """
        self.api_url=api_url
        
    def send_single_request(self,rec:pd.Series,mat_type_col:str,nomeclature_col:str,mat_type_descr_col:str=None,mat_type_sep:str=",",n_predictions:int=1)->list[tuple[str,float]]:
        """Послать запрос по единичной номенклатуре 

        Args:
            rec (pd.Series): Запись из dataframe
            mat_type_col (str): Колонка Вида материала (сложный или простой)
            nomeclature_col (str): Колонка номенклатуры
            mat_type_descr_col (str, optional): Колонка описания вида метариала. Defaults to None.
            mat_type_sep (str, optional): Разделитель сложного вида материала. Defaults to ",".
            n_predictions (int, optional): Количество вариантов. Defaults to 1.

        Returns:
            list[tuple[str,float]]: Набор результатов
        """
        try:
            nomeclature=str(rec[nomeclature_col])
            mat_type_code=None
            mat_type_descr=None
            if mat_type_descr_col is None:
                mat_type_splt = str(rec[mat_type_col]).split(mat_type_sep)
                mat_type_code = mat_type_splt[0].strip()
                mat_type_descr = mat_type_splt[1].strip()
            else:
                mat_type_code = str(rec[mat_type_col])
                mat_type_descr = str(rec[mat_type_descr_col])
            request_data = {"data":[{"type_code":mat_type_code,"material_type":mat_type_descr,"name":nomeclature}], "n_predictions":n_predictions}
            response = requests.post(self.api_url,json=request_data)
            rjson = response.json()
            result_dict:dict = rjson["predictions"][0]
            result = []
            for key in result_dict.keys():
                prc = round(float(result_dict[key])*100,1)
                result.append((key,prc))
            return result
        except: raise